/*
 * Cliente.java
 *
 * Created on 14 de Maio de 2007, 17:11
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package pt.iscte.dcti.es.rhplus.utilizador;

import java.sql.SQLException;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.servico.Servico;
import pt.iscte.dcti.es.rhplus.sistema.CodigoPostal;
import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**

 */
public abstract class Cliente extends Utente {

    protected int numero_de_cliente;
    protected LinkedList<MembroDoAgregado> lista_de_membros_do_agregado;
    protected String tipo;
    public static final String PARTICULAR = "particular";
    public static final String EMPRESA = "empresa";

    /** Creates a new instance of Cliente */
    public Cliente(final int id_pessoa, final String nome, final char sexo, final int bi, final Date data_de_nascimento, final int nif,
            final String email, final int telefone, final int telemovel, final String morada, final String grupo_sanguineo,
            final CodigoPostal codigo_postal, final LinkedList<TratamentoPassado> lista_de_tratamentos_passados,
            LinkedList<DoencaPassada> lista_de_doencas_passadas, final int numero_de_cliente,
            final LinkedList<MembroDoAgregado> lista_de_membros_do_agregado) {

        super(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo, codigo_postal,
                lista_de_tratamentos_passados, lista_de_doencas_passadas);

        this.numero_de_cliente = numero_de_cliente;
        this.lista_de_membros_do_agregado = lista_de_membros_do_agregado;
        this.tipo = "cliente";
    }

    public int getNumeroDeCliente() {
        return numero_de_cliente;
    }

    public boolean temMembrosDoAgregado() {
        return !this.lista_de_membros_do_agregado.isEmpty();
    }

    public LinkedList<MembroDoAgregado> getListaDeMembrosDoAgregado() {
        return this.lista_de_membros_do_agregado;
    }

    public void adicionaMembroDoAgregado(final Hashtable<String, Object> dados_membro_do_agregado) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        // Inserir na base de dados.
        MembroDoAgregado.insere(dados_membro_do_agregado);

        // Adiciona a instancia do objecto.
        int ultimo_id_inserido = MembroDoAgregado.devolveUltimoIdentificadorDeInsercao();
        MembroDoAgregado membro_do_agregado = MembroDoAgregado.devolve(ultimo_id_inserido);
        this.lista_de_membros_do_agregado.add(membro_do_agregado);
    }

    public void alteraMembroDoAgregado(final Hashtable<String, Object> dados_membro_do_agregado) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        // Procura a instancia do objecto.
        int id_pessoa_do_membro_do_agregado = ((Integer) dados_membro_do_agregado.get("id_pessoa"));
        MembroDoAgregado membro_do_agregado = this.getMembroDoAgregado(id_pessoa_do_membro_do_agregado);

        // Altera o objecto.
        membro_do_agregado.setNome((String) dados_membro_do_agregado.get("var_nome"));
        membro_do_agregado.setSexo(((String) dados_membro_do_agregado.get("var_sexo")).charAt(0));
        membro_do_agregado.setBI(((Integer) dados_membro_do_agregado.get("var_bi")));
        membro_do_agregado.setDataDeNascimento(((Date) dados_membro_do_agregado.get("var_data_de_nascimento")));
        membro_do_agregado.setNIF(((Integer) dados_membro_do_agregado.get("var_nif")));
        membro_do_agregado.setEmail(((String) dados_membro_do_agregado.get("var_email")));
        membro_do_agregado.setTelefone(((Integer) dados_membro_do_agregado.get("var_telefone")));
        membro_do_agregado.setTelemovel(((Integer) dados_membro_do_agregado.get("var_telemovel")));
        membro_do_agregado.setMorada(((String) dados_membro_do_agregado.get("var_morada")));
        membro_do_agregado.setGrupoSanguineo(((String) dados_membro_do_agregado.get("var_grupo_sanguineo")));
        membro_do_agregado.setCodigoPostal(CodigoPostal.devolve(((Integer) dados_membro_do_agregado.get("var_id_codigo_postal"))));

        // Invoca o metodo gravaParaBaseDeDados para gravar o objecto.
        membro_do_agregado.gravaParaBaseDeDados();
    }

    public MembroDoAgregado getMembroDoAgregado(final int id_membro_do_agregado) {
        // Procura o membro do agregado associado ao identificador.
        Iterator<MembroDoAgregado> iterator = lista_de_membros_do_agregado.iterator();
        while (iterator.hasNext()) {
            MembroDoAgregado membro_do_agregado = iterator.next();
            if (membro_do_agregado.equals(id_membro_do_agregado)) {
                return membro_do_agregado;
            }
        }

        // Se o Membro do Agregado nao foi encontrado devolve null.
        return null;
    }

    public void removeMembroDoAGregado(final int id_membro_do_agregado) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Remove da instancia do objecto
        Iterator<MembroDoAgregado> iterator = lista_de_membros_do_agregado.iterator();
        boolean encontrou_membro_do_agregado = false;
        while (iterator.hasNext() && !encontrou_membro_do_agregado) {
            if (iterator.next().equals(id_membro_do_agregado)) {
                iterator.remove();
                encontrou_membro_do_agregado = true;
            }
        }

        // Remove do local de persistencia
        MembroDoAgregado.remove(id_membro_do_agregado);
        //Helio11{
        Servico.removePorIDDoUtente(id_membro_do_agregado);
        //}Helio11
    }

    public static void insereParticular(final Hashtable<String, Object> dados_cliente_particular) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        // Inserir na base de dados - Pessoa.
        Pessoa.insere(dados_cliente_particular);

        // Inserir na base de dados - Cliente
        int ultimo_id_inserido = Pessoa.devolveUltimoIdentificadorDeInsercao();

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("inserir_cliente_particular");
        dados_cliente_particular.put("var_id_pessoa", new Integer(ultimo_id_inserido));
        acesso_bd.executaUpdate(qryName, dados_cliente_particular);
        acesso_bd.fechaLigacao();
    }

    public static void insereEmpresa(final Hashtable<String, Object> dados_cliente_empresa) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        // Inserir na base de dados - Pessoa.
        Pessoa.insere(dados_cliente_empresa);

        // Inserir na base de dados - Cliente
        int ultimo_id_inserido = Pessoa.devolveUltimoIdentificadorDeInsercao();

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("inserir_cliente_empresa");
        dados_cliente_empresa.put("var_id_pessoa", ultimo_id_inserido);
        acesso_bd.executaUpdate(qryName, dados_cliente_empresa);
        acesso_bd.fechaLigacao();

    }

    public static void remove(final int id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        // Remove da base de dados - Pessoa.
        Pessoa.remove(id_pessoa);

        // Remove da base de dados - Cliente.
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("remover_cliente");
        Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
        dados_da_pessoa.put("var_id_pessoa", new Integer(id_pessoa));

        acesso_bd.executaUpdate(qryName, dados_da_pessoa);
        acesso_bd.fechaLigacao();
    }

    public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        super.gravaParaBaseDeDados();
    }

    public String getTipo() {
        return "cliente base";
    }
}
